明日復明日,Lambda 何其多
- 昨日 day25 少了的 function 就是 generateRSS(feed Feed) 啦,這個是最精華的部分
- 要把 feed.json 轉換成為 feed.rss,一定會有很華麗的操作吧?
該怎麼做
- 就是把東西通通加起來就好了,不要猶豫,不要猶豫,不要猶豫
- 按照 RSS 的範例與規範,把 feed.json 的內容轉安插到文字當中
- 因為在 s3.PutObjectInput 的 ContentType 已經指定為
application/xml
所以上傳的檔案只要符合規範,對齊 tag,就可以是合法的 rss
- 這邊就不多說了,直接看醜醜醜的 code 吧
func generateRSS(feed Feed) []byte {
rss := `<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">`
rss += `<channel>`
rss += fmt.Sprintf(`<title><![CDATA[%s]]></title>`, feed.Podcast.Title)
rss += fmt.Sprintf(`<description><![CDATA[%s]]></description>`, feed.Podcast.Description)
rss += fmt.Sprintf(`<link>%s</link>`, feed.Podcast.Link)
rss += fmt.Sprintf(`<image><url>%s</url><title>%s</title><link>%s</link></image>`, feed.Podcast.Image.URL, feed.Podcast.Image.Title, feed.Podcast.Image.Link)
rss += fmt.Sprintf(`<generator>%s</generator>`, "{YOUR_DOMAIN}")
rss += fmt.Sprintf(`<lastBuildData>%s</lastBuildData>`, feed.Podcast.LastBuildDate)
rss += fmt.Sprint(`<atom:link href="https://{YOUR_DOMAIN}/feed.rss" rel="self" type="application/rss+xml"/>`)
rss += fmt.Sprintf(`<author><![CDATA[%s]]></author>`, feed.Podcast.Author)
rss += fmt.Sprintf(`<copyright><![CDATA[%s]]></copyright>`, feed.Podcast.Author)
rss += fmt.Sprintf("<language>%s</language>", feed.Podcast.Language)
rss += fmt.Sprintf(`<category><![CDATA[%s]]></category>`, feed.Podcast.CategoryMain)
rss += fmt.Sprintf(`<category><![CDATA[%s]]></category>`, feed.Podcast.CategorySub)
rss += fmt.Sprintf(`<itunes:author>%s</itunes:author>`, feed.Podcast.Author)
rss += fmt.Sprintf(`<itunes:summary><![CDATA[%s]]></itunes:summary>`, feed.Podcast.Description)
rss += fmt.Sprintf(`<itunes:image href="%s"/>`, feed.Podcast.Image.URL)
rss += fmt.Sprintf(`<itunes:type>%s</itunes:type>`, feed.Podcast.Type)
rss += fmt.Sprint(`<itunes:owner>`)
rss += fmt.Sprintf(`<itunes:name><![CDATA[%s]]></itunes:name>`, feed.Podcast.Author)
rss += fmt.Sprintf(`<itunes:email>%s</itunes:email>`, feed.Podcast.Email)
rss += fmt.Sprintf(`</itunes:owner>`)
rss += fmt.Sprintf(`<itunes:explicit>%s</itunes:explicit>`, feed.Podcast.Explicit)
rss += fmt.Sprintf(`<itunes:category text="%s"> <itunes:category text="%s" /></itunes:category>`, feed.Podcast.CategoryMain, feed.Podcast.CategorySub)
for _, v := range feed.Podcast.Episodes {
rss += fmt.Sprintf(`<item>`)
rss += fmt.Sprintf(`<title><![CDATA[%s]]></title>`, v.Title)
rss += fmt.Sprintf(`<description><![CDATA[%s]]></description>`, v.Description)
rss += fmt.Sprintf(`<link>%s</link>`, v.Link)
rss += fmt.Sprintf(`<guid>%s</guid>`, strings.Split(v.Link, "/")[:len(strings.Split(v.Link, "/"))-1])
rss += fmt.Sprintf(`<dc:creator><![CDATA[%s]]></dc:creator>`, v.Creator)
rss += fmt.Sprintf(`<pubDate>%s</pubDate>`, feed.Podcast.LastBuildDate)
rss += fmt.Sprintf(`<enclosure url="%s" length="%s" type="audio/mpeg"/>`, v.Audio, v.Duration)
rss += fmt.Sprintf(`<itunes:summary><![CDATA[%s]]></itunes:summary>`, v.Description)
rss += fmt.Sprintf(`<itunes:explicit>%s</itunes:explicit>`, v.Explicit)
rss += fmt.Sprintf(`<itunes:duration>%s</itunes:duration>`, v.Duration)
rss += fmt.Sprintf(`<itunes:image href="%s"/>`, v.Image)
rss += fmt.Sprintf(`<itunes:episode>%d</itunes:episode>`, v.Episode)
rss += fmt.Sprintf(`<itunes:episodeType>%s</itunes:episodeType>`, v.Type)
rss += fmt.Sprintf(`</item>`)
}
rss += `</channel></rss>`
return []byte(rss)
}
- 就是這樣樸實無華的加起來,記得替換掉
{YOUR_DOMAIN}
,或是把 domain 也放到 feed.json 中,這樣就可以動態生成了
其他延伸
- 製作完成後別忘了把 feed.rss 的 url 放到 day24 介紹的 rss validator 中檢查一下,確保沒有問題喔
- 除了
itunes
專屬的 tag 外,其實 google 也有自己的 tag,但不用加上了,因為 G 社要終止 Podcast 服務,慢慢轉移到 Youtube Music 上
外出取材番外
- 這是一個在艾雷島上發現,既是貓貓又是狗狗的存在